﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BackEndSystemWebTv.Enums;

namespace BackEndSystemWebTv
{
    public partial class Log : BU.ILogging
    {
        private Gebruiker gebruiker;

        #region Logs ophalen

        /// <summary>
        /// Haal logs op (Allemaal)
        /// </summary>
        /// <returns>Lijst met logbestanden</returns>
        public List<LogBestand> LogsOphalen()
        {
            var logs =
                from l in DatabaseEntities.Instance.Logs
                select l;
            return MaakTotaalLijst(logs);
        }

        /// <summary>
        /// Logs ophalen (o.b.v. SocialeMedium)
        /// </summary>
        /// <param name="socialMedium">Enum socialmedium</param>
        /// <returns>Lijst met logbestanden</returns>
        public List<LogBestand> LogsOphalen(ESocialMedium socialMedium)
        {
            string sm = socialMedium.ToString();

            var logs =
                from g in DatabaseEntities.Instance.Logs
                where g.SociaalMedium == sm
                select g;  
            return MaakTotaalLijst(logs);
        }

        /// <summary>
        /// Haal logs op (o.b.v. Gebruikersnaam)
        /// </summary>
        /// <param name="gebruikersnaam">Gebruikersnaam als string</param>
        /// <returns>Lijst met logbestanden</returns>
        public List<LogBestand> LogsOphalen(string gebruikersnaam)
        {
            Gebruiker geb = Gebruiker.GebruikerOphalen(gebruikersnaam);

            if (geb != null)
            {
                var logs =
                    from g in DatabaseEntities.Instance.Logs
                    where g.Gebruiker.Gebruikersnaam == geb.Gebruikersnaam
                    select g;
                return MaakTotaalLijst(logs);
            }
            return null;
        }

        /// <summary>
        /// Ophalen van de logs (Tijdgebonden)
        /// </summary>
        /// <param name="begintTijd"></param>
        /// <param name="eindTijd"></param>
        /// <returns></returns>
        public List<LogBestand> LogsOphalen(DateTime begintTijd, DateTime eindTijd)
        {
            if (begintTijd >= eindTijd)
                return null;
            else
            {              
                var logs =
                    from l in DatabaseEntities.Instance.Logs
                    where l.Datum > begintTijd && l.Datum < eindTijd
                    select l;
                return MaakTotaalLijst(logs);
            }
        }

        public List<LogBestand> LogsOphalenZoekterm(string zoekterm)
        {
            var logs =
                from l in DatabaseEntities.Instance.Logs
                where l.Inhoud.Contains(zoekterm)
                select l;
            return MaakTotaalLijst(logs);
        }
        
        /// <summary>
        /// Maak een totaal lijst van de gegevens die opgehaald
        /// zijn uit de entiteit Log
        /// </summary>
        /// <param name="logs"></param>
        /// <returns></returns>
        private List<LogBestand> MaakTotaalLijst(IQueryable<Log> logs)
        {
            List<LogBestand> logLijst = new List<LogBestand>();
            foreach (var item in logs)
            {
                LogBestand logbestand = new LogBestand();
                gebruiker = item.Gebruiker;
                //sociaalMedium = SociaalMedium.HaalSociaalMediumOp(item.LogId);
                
                //Maak logbestand
                logbestand.LogId = item.LogId;
                logbestand.Datum = item.Datum;
                logbestand.Inhoud = item.Inhoud;
                logbestand.SociaalMedium = item.SociaalMedium.ToString();
                logbestand.Gebruiker = item.Gebruiker.Gebruikersnaam;
                logbestand.GebruikersId = item.GebruikerGebruikersId;
                
                //Voeg toe aan totaal lijst van alle logbestanden
                logLijst.Add(logbestand);
            }
            return logLijst;
        }

        #endregion

        #region Logs aanmaken

        /// <summary>
        /// Het aanmaken van een log. 
        /// </summary>
        /// <param name="inhoud">Tekstuele inhoud van de log</param>
        /// <param name="gebruikersnaam">Welke gebruiker heeft deze log aangemaakt</param>
        /// <param name="socialMedium">Van welk SM is deze log afkomstig</param>
        /// <returns>Logresultaat</returns>
        public ELogResultaat LogChatActiviteit(string inhoud, string gebruikersnaam, ESocialMedium eSm)
        {
            if (inhoud == string.Empty)
                return ELogResultaat.LogInfoOngeldig;
            else if(Gebruiker.ControleerBestaandeNaam(gebruikersnaam))
                return ELogResultaat.GebruikerOngeldig;
            //else if (DatabaseEntities.Instance.Connection.State != ConnectionState.Open)
            //    return ELogResultaat.DatabaseNietToegankelijk;
            else
            {
                gebruiker = Gebruiker.GebruikerOphalen(gebruikersnaam);
                DatabaseEntities.Instance.AddToLogs(Log.CreateLog(0, DateTime.Now, inhoud, gebruiker.GebruikersId, eSm.ToString()));
                DatabaseEntities.Instance.SaveChanges();
                
                return ELogResultaat.Succes;
            }
        }

        /// <summary>
        /// Maakt eerste log aan voor gebruiker
        /// </summary>
        /// <param name="gebruikersID"></param>
        public Log MaakStartLog(int gebruikersID, string gebruikersnaam)
        {
            Log log = new Log();
            log = Log.CreateLog(0, DateTime.Now, String.Format("Gebruiker {0} toegevoegd aan programma", gebruikersnaam), gebruikersID, "Systeem");
            return log;
        }
        #endregion

        #region Logs verwijderen
        /// <summary>
        /// Verwijder logs o.b.v. een eindtijd. Alle logs voor de eindtijd worden verwijderd.
        /// </summary>
        /// <param name="eindTijd"></param>
        /// <returns></returns>
        public EVerwijderLogResultaat VerwijderLogsDoorLeeftijd(DateTime eindTijd)
        {            
            var logs =
                from l in DatabaseEntities.Instance.Logs
                where l.Datum < eindTijd
                select l;
            
            if(logs.Count() == 0)
                return EVerwijderLogResultaat.GeenMatchendeLogsGevonden;

            foreach (var g in logs)
            {
                DatabaseEntities.Instance.Logs.DeleteObject(g);
            }
            DatabaseEntities.Instance.SaveChanges();
            return EVerwijderLogResultaat.Succes;
        }

        #endregion
    }
}

//Gebruiker gebr = new Gebruiker();
//    var gebruiker = 
//        from g in DatabaseEntities.Instance.Gebruikers 
//        where g.GebruikersId == 1 
//        select g; //Ik heb hier gebruikersID 4 maar dat kan vanalles zijn.

//    foreach (var item in gebruiker)
//    {
//        gebr = item;
//    }

//    foreach (Autorisatie aut in gebr.Autorisaties)
//    {
//        lbSm.Items.Add(aut.SociaalMedium.Sociaalmedium.ToString());
//    }
//    foreach (Log log in gebr.Logs)
//    {
//        lbLogs.Items.Add(log.Inhoud);
//    }


//{       private static DatabaseEntities instance;

//        public static DatabaseEntities Instance
//        {
//            get
//            {
//                if(instance==null)
//                    instance = new DatabaseEntities();
//                return instance;
//            }
//        }